package ug.edu.ec.cron;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.*;

import javax.mail.*;
import javax.mail.internet.*;

import ug.edu.ec.libs.Utils;

public class EnvioNotificaciones {
	private String vStrDestinatario;
	private String vStrMessage;
	private Utils objUtils;
	private Utils objUtilsConexion;
	private Utils objUtilsTipoAlerta;

	public EnvioNotificaciones(){
		objUtils = new Utils();
		objUtils.setProperties("/resources/emailing.properties");
		objUtilsConexion = new Utils();
		objUtilsConexion.setProperties("/resources/conexiones.properties");

	    objUtilsTipoAlerta = new Utils();
		objUtilsTipoAlerta.setProperties("/resources/alertastipo.properties");
		
	}

	public static void main(String[] args) {
	
			EnvioNotificaciones objEnvioNotif = new EnvioNotificaciones();
			
			try {
				Class.forName(objEnvioNotif.getObjUtilsConexion().getObjProperties().getProperty(
						"forname"));
		
			Connection objConnectionSeguridad = DriverManager
					.getConnection(objEnvioNotif.getObjUtilsConexion().getObjProperties()
							.getProperty("urlSeguridad"));
			Connection objConnectionNotificaciones = DriverManager
					.getConnection(objEnvioNotif.getObjUtilsConexion().getObjProperties()
							.getProperty("urlNotificaciones"));
			
			System.out.println("\nEnviando Notificaciones del Sistema");
			objEnvioNotif.getEstructurasNotficaciones(objConnectionSeguridad,objConnectionNotificaciones);
			System.out.println("\nFin Notificaciones del Sistema");
			
			
			
			} catch (ClassNotFoundException | SQLException e) {
				e.printStackTrace();
			}
			System.exit(0);
	}

	public void sendEmail(String vStrReceptor, String vStrMensaje,String vStrSubject) throws AddressException, MessagingException {
		Properties properties = this.objUtils.getObjProperties();
		Session session = Session.getDefaultInstance(properties);

		System.out.println("\nEnviando Email: " + vStrReceptor);
		MimeMessage message = new MimeMessage(session);
		message.setFrom(new InternetAddress(String.valueOf(this.objUtils
				.getObjProperties().get("mail.smtp.user"))));
		message.addRecipient(Message.RecipientType.TO, new InternetAddress(vStrReceptor));

		message.setSubject(this.objUtilsTipoAlerta.getObjProperties()
				.getProperty(vStrSubject));
		message.setContent(vStrMensaje,
				"text/html; charset=utf-8");

		Transport transport = session.getTransport("smtp");
		transport.connect(
				String.valueOf(this.objUtils.getObjProperties().get(
						"mail.smtp.host")),
				String.valueOf(this.objUtils.getObjProperties().get(
						"mail.smtp.user")),
				String.valueOf(this.objUtils.getObjProperties().get(
						"mail.smtp.password")));
		transport.sendMessage(message, message.getAllRecipients());
		transport.close();
		System.out.print("OK");
	}

	public void getEstructurasNotficaciones(Connection objConnectionSeguridad,Connection objConnectionNotificaciones)throws SQLException {

		String vStrSQL = "SELECT Id,MensajesId,UsuariosId,Tipo,Estado FROM Notificaciones.DestinatariosxMensaje WHERE Estado='A'";
		PreparedStatement objPrepareStatement = objConnectionNotificaciones
				.prepareStatement(vStrSQL);
		ResultSet objResult = objPrepareStatement.executeQuery();

		while (objResult.next()) {
			try{
			this.setvStrDestinatario(this.getEmail(objConnectionSeguridad, objResult.getString("UsuariosId")));
			this.setvStrMessage(this.getMessage(objConnectionNotificaciones,objResult.getString("MensajesId")));
			this.sendEmail(this.getvStrDestinatario(),this.getvStrMessage(),"ALERTA");
			 vStrSQL = "UPDATE Notificaciones.DestinatariosxMensaje SET Estado='E' WHERE Estado='A' AND Id=? ";
			 objPrepareStatement = objConnectionNotificaciones
						.prepareStatement(vStrSQL);
				objPrepareStatement.setString(1, objResult.getString("Id"));
				objPrepareStatement.executeUpdate();
			} catch (MessagingException mex) {
				mex.printStackTrace();
			} catch (SQLException e) {
				e.printStackTrace();
			}

		}

	}

	public String getEmail(Connection objConnectionSeguridad, String vStrUsuarioID)
			throws SQLException {
		String vStrEmail = "";
		String vStrSQL = "SELECT EmailPrincipal FROM Seguridad.Usuarios WHERE Id=?";
		PreparedStatement objPrepareStatement = objConnectionSeguridad
				.prepareStatement(vStrSQL);
		objPrepareStatement.setString(1, vStrUsuarioID);
		ResultSet objResult = objPrepareStatement.executeQuery();
		while (objResult.next()) {
				vStrEmail = objResult.getString("EmailPrincipal");
		}
		return vStrEmail;
	}

	public String getMessage(Connection objConnection, String vStrMessageID)
			throws SQLException {
		String vStrDetalle = "";
		String vStrSQL = "SELECT Detalle FROM Notificaciones.Mensajes WHERE Id=?";
		PreparedStatement objPrepareStatement = objConnection
				.prepareStatement(vStrSQL);
		objPrepareStatement.setString(1, vStrMessageID);
		ResultSet objResult = objPrepareStatement.executeQuery();
		while (objResult.next()) {
			vStrDetalle = objResult.getString("Detalle");
		}
		return vStrDetalle;
	}

	public String getvStrDestinatario() {
		return vStrDestinatario;
	}

	public void setvStrDestinatario(String vStrDestinatario) {
		this.vStrDestinatario = vStrDestinatario;
	}

	public String getvStrMessage() {
		return vStrMessage;
	}

	public void setvStrMessage(String vStrMessage) {
		this.vStrMessage = vStrMessage;
	}

	public Utils getObjUtils() {
		return objUtils;
	}

	public void setObjUtils(Utils objUtils) {
		this.objUtils = objUtils;
	}

	public Utils getObjUtilsConexion() {
		return objUtilsConexion;
	}

	public void setObjUtilsConexion(Utils objUtilsConexion) {
		this.objUtilsConexion = objUtilsConexion;
	}

	public Utils getObjUtilsTipoAlerta() {
		return objUtilsTipoAlerta;
	}

	public void setObjUtilsTipoAlerta(Utils objUtilsTipoAlerta) {
		this.objUtilsTipoAlerta = objUtilsTipoAlerta;
	}

}